/**
 * git文件同步器
 * 需要先安装git工具
 */

const { exec } = require("child_process");
// const process = require('process');
const iconv = require("iconv-lite");
const moment = require("moment");
const fs = require("fs");

const encoding = "cp936"; //输出编码 就是gb2312 中文
const binaryEncoding = "binary"; //文件编码为二进制

/**
 * 执行一行cmd命令
 */
async function cmd(text) {
  return new Promise((resolve, reject) => {
    exec(
      text,
      { encoding: binaryEncoding },
      (err = "", stdout = "", stderr) => {
        if (err) {
          resolve("错误");
          return;
        }
        resolve(iconv.decode(Buffer.from(stdout, binaryEncoding), encoding));
      }
    );
  });
}

/**
 * 运行顺序 逻辑
 * git status 判断目录与仓库状态 not a git repository是未绑定远程仓库
 * 若已绑定仓库，可使用git pull进行拉取文件，将仓库文件同步到本地
 * 再使用git status判断本地是否有修改文件，如果修改了 可以使用git add 和 git commit 和 git push将本地文件同步到仓库
 */
async function run() {
  const time = moment().format("YYYY-MM-DD HH:mm:ss");
  let status = (await cmd(`git status`)) || "";
  if (
    status.includes(`not a git repository (or any of the parent directories)`)
  ) {
    //目录未绑定git地址
    console.log("目录未绑定git地址");
  } else {
    //已绑定git
    //拉取
    const pull = (await cmd(`git pull`)) || "";
    if (
      !pull.includes(`Already up to date`) &&
      !pull.includes(`Already up-to-date`)
    ) {
      //拉取下来了最新数据
      console.log(`拉取了最新数据。时间:${time}`);
    }
    //状态
    status = (await cmd(`git status`)) || "";
    if (status.includes(`(use "git add"`)) {
      //本地内容有改动 需要提交
      (await cmd(`git add .`)) || "";
      (await cmd(`git commit -m 同步`)) || "";
      (await cmd(`git push`)) || "";
      console.log(`同步成功。时间:${time}`);
    }
  }
}

/**
 * 初始化
 *
 * 判断.gitignore文件是否存在，若不存在则创建，若存在则看*.exe规则是否存在，若不存在则加入，若存在则什么都不做
 * 每15秒在后台运行一次检查和同步
 */
function init() {
  const ishave = fs.existsSync("./.gitignore");
  if (!ishave) {
    fs.writeFileSync("./.gitignore", "*.exe\n");
  } else {
    const content = fs.readFileSync("./.gitignore", "utf-8");
    const lines = content.split(/\r?\n/);
    if (!lines.includes("*.exe")) {
      fs.appendFileSync("./.gitignore", "\n*.exe\n");
    }
  }
  //运行同步 每15秒执行一次
  setInterval(() => {
    run();
  }, 1000 * 15);
  console.log("监听中，可切换至后台运行!");
  run();
}

init();

// console.log(__dirname, __filename)
